package admin

import (
	"ginstu/utils"
	"github.com/gin-gonic/gin"
	"net/http"
	"os"
	"path"
	"strconv"
)

type UserController struct {
}

// Admin 新增设置cookie
func (con UserController) Admin(ctx *gin.Context) {
	// 设置 cookie
	/*
		name string  cookie 名称
		value string cookie 值
		maxAge int   cookie 过期时间 / 秒 ==> 0 表示浏览器关闭即失效, < 0 表示设置过期时间, < 0 表示删除cookie
		path string  cookie 生效路径    默认 /
		domain string cookie 生效域名  需要设置成域名 ==> .xxx.com 设置二级域名共享
		secure bool  cookie 是否安全 ==> https / http  ==> true 在http无效, 仅在https有效; false 均可使用
		httpOnly bool cookie 是否可在前端操作 ==> 根据需求设置
	*/
	ctx.SetCookie("username", "tiger", 3600, "/", "localhost:8080", false, false)
	ctx.JSON(http.StatusOK, gin.H{
		"title": "后台首页",
		"msg":   "设置成功",
	})
}

func (con UserController) List(ctx *gin.Context) {
	ctx.JSON(http.StatusOK, gin.H{
		"title": "后台用户",
	})
}

// SingleUpload 单文件上传
func (con UserController) SingleUpload(ctx *gin.Context) {
	// 获取表单填写的名字
	username := ctx.PostForm("username")
	// 获取表单上传的文件
	file, err := ctx.FormFile("uploadFile")
	// 拼接上传路径
	dst := path.Join("./upload/", file.Filename)
	if err == nil {
		// 文件上传
		err := ctx.SaveUploadedFile(file, dst)
		if err != nil {
			return
		}
	} else {
		panic(err)
	}
	// 返回结果
	ctx.JSON(http.StatusOK, gin.H{
		"username": username,
		"success":  true,
		"file":     file.Filename,
		"dst":      dst,
	})
}

// MultiUpload1 多文件上传  ==> 数组上传
func (con UserController) MultiUpload1(ctx *gin.Context) {
	form, _ := ctx.MultipartForm()
	files, _ := form.File["uploadFile[]"]

	for _, file := range files {
		dst := path.Join("./upload", file.Filename)
		err := ctx.SaveUploadedFile(file, dst)
		if err != nil {
			return
		}
	}
	ctx.JSON(http.StatusOK, gin.H{
		"success": true,
		"files":   files,
	})
}

// MultiUpload2 多文件上传 ==> 不同文件名
func (con UserController) MultiUpload2(ctx *gin.Context) {
	username := ctx.PostForm("username")
	file1, err1 := ctx.FormFile("uploadFile1")
	dst1 := path.Join("./upload", file1.Filename)
	if err1 == nil {
		err := ctx.SaveUploadedFile(file1, dst1)
		if err != nil {
			return
		}
	}
	file2, err2 := ctx.FormFile("uploadFile2")
	dst2 := path.Join("./upload", file2.Filename)
	if err2 == nil {
		err := ctx.SaveUploadedFile(file2, dst2)
		if err != nil {
			return
		}
	}

	ctx.JSON(http.StatusOK, gin.H{
		"username": username,
		"file1":    file1.Filename,
		"dst1":     dst1,
		"file2":    file2.Filename,
		"dst2":     dst2,
		"success":  true,
	})
}

// UploadGroup 上传文件分组
func (con UserController) UploadGroup(ctx *gin.Context) {
	allowMap := map[string]bool{
		".jpg":  true,
		".png":  true,
		".gif":  true,
		".jpeg": true,
	}
	// 1、获取上传的文件
	file, err := ctx.FormFile("uploadFile")
	if err != nil {
		panic(err)
	}
	// 2、获取后缀名 判断类型是否正确.jpg .png .gif .jpeg
	extName := path.Ext(file.Filename)
	_, ok := allowMap[extName]
	if !ok {
		ctx.JSON(http.StatusBadRequest, gin.H{
			"success": false,
			"msg":     "不合法",
		})
	}
	// 3、创建图片保存目录static/upload/20210624
	// 获取今天的日期
	day := utils.GetDay()
	dir := path.Join("./upload", day)
	// 创建目录
	err = os.MkdirAll(dir, 0666)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{
			"success": false,
			"msg":     "创建目录失败",
		})
	}
	// 4、生成文件名称和文件保存的目录
	fileName := strconv.FormatInt(utils.GetUnix(), 10) + extName
	dst := path.Join(dir, fileName)
	// 5、执行上传
	err = ctx.SaveUploadedFile(file, dst)
	if err != nil {
		return
	}

	// 响应
	ctx.JSON(http.StatusOK, gin.H{
		"success":    true,
		"originFile": file.Filename,
		"dst":        dst,
		"newFile":    fileName,
	})

	/*
			最终响应结果
			{
		    "dst": "upload/20231126/1700987903.jpg",
		    "newFile": "1700987903.jpg",
		    "originFile": "1.jpg",
		    "success": true
			}
	*/
}

// GetCookie 获取cookie
func (con UserController) GetCookie(ctx *gin.Context) {
	username, _ := ctx.Cookie("username")
	ctx.JSON(http.StatusOK, gin.H{
		"cookie":  username,
		"success": true,
	})
}
